package com.dys.testio06;

import java.io.*;

/**
 * @className: src.main.java.com.dys.testio06.InputStreamReaderAndOutputStream
 * @description: src.main.java.com.dys.testio06
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/15 下午11:08
 */
public class InputStreamReaderAndOutputStream {

    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) throws IOException {
        new InputStreamReaderAndOutputStream().copyFile();
    }

    /**
     * 输入的字节流转换为输入的字节流
     */
    public void byteStreamToCharStream() throws IOException {
        // 文件-->程序
        // 1.有一份源文件
        File f = new File("e:\\test.txt");
        // 2.需要一个输入的字节流接触文件
        FileInputStream fis = new FileInputStream(f);
        // 3.加入一个转换流: 将字节流转换为字符流：转换流属于一个处理流，如果编码格式不统一的话，在控制台就会出现乱码
        InputStreamReader isr = new InputStreamReader(fis, "gbk");
        // 获取程序本身的编码--》utf-8
        // InputStreamReader isr = new InputStreamReader(fis);
        // InputStreamReader isr = new InputStreamReader(fis,"utf-8");
        // 4.开始转换,将文件中的内容显示在控制台
        char[] buf = new char[10];
        int n = isr.read(buf);
        while (n != -1) {
            // 将缓冲数组转为字符串在控制台上打印出来
            System.out.print(new String(buf, 0, n));
            n = isr.read(buf);
        }
        // 5.关流
        isr.close();
    }

    /**
     * 利用转换流复制文件
     * 应用场景：在跨字符集拷贝文件
     *
     * @throws IOException
     */
    public void copyFile() throws IOException {
        // 1.有一份源文件
        // File f1 = new File("e:\\test.txt");
        File f1 = new File("D:\\LenovoStoreDownloads\\python课本习题以及答案.doc");
        // 2.有一份目标文件
        // File f2 = new File("e:\\Demo.txt");
        File f2 = new File("e:\\Demo.doc");
        // 3.有一根管 怼到 源文件上
        FileInputStream fis = new FileInputStream(f1);
        // 4.有一根管 怼到 目标文件上
        FileOutputStream fos = new FileOutputStream(f2);
        // 5.加入转换流，将字节流转换为字符流，这个编码跟文本本身的编码格式统一: 源文件的二进制内容转换为对应编码字符集的字符；
        InputStreamReader isr = new InputStreamReader(fis, "utf-8");
        // 6.加入转换流，将输出的字符流转换为字节流,把字符输出流 编码为作为参数的字节输出流
        OutputStreamWriter osw = new OutputStreamWriter(fos, "gbk");
        // 7.开始复制
        char[] buf = new char[20];
        int len = isr.read(buf);
        while (len != -1) {
            osw.write(buf, 0, len);
            len = isr.read(buf);
        }
        // 8.关流
        osw.close();
        isr.close();
    }
}
